LOG = False

import network
sta_if = network.WLAN(network.STA_IF)

if not sta_if.isconnected():
    sta_if.active(True)
    sta_if.connect("FCSM", "SYnk0795")
    while not sta_if.isconnected():
        pass
    if LOG: print("Подключены к WiFi")
if LOG: print("IP-адрес сервера:", sta_if.ifconfig()[0])

from kernel.Containers.Container import Containerize, AnonymusContainer

import usocket as socket
import machine
import uselect as select

# Приветствие
WELCOME_MSG = """\
Добро пожаловать в Telnet-сервер для трансляции данных с UART!
\rПожалуйста, выберите порт UART:
\r1. UART1
\r2. UART2
\r"""

# Создаем сокет для прослушивания Telnet-соединений
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('', 23))
server_socket.listen(1)

if LOG: print("Telnet-сервер запущен. Ожидание подключений...")

# Функция для обработки UART
def handle_uart(uart, client_socket):
    while True:
        # Ждем данных с UART или Telnet-клиента
        rs, _, _ = select.select([uart, client_socket], [], [])

        # Если есть данные с UART, отправляем их на Telnet-клиент
        if uart in rs:
            data = uart.read()
            if data:
                client_socket.sendall(data)

        # Если есть данные от Telnet-клиента, отправляем их на UART
        if client_socket in rs:
            data = client_socket.recv(1024)
            if not data:
                break
            uart.write(data)

def sock_input(sock, text="", cast_type=str, default=None):
    sock.sendall(text)
    while True:
        try:
            data = sock.recv(1024).decode()[:-2]
            if LOG: print(data)
            if not data and default:
                return default
            else:
                return cast_type(data)
        except: continue
def sock_if LOG: print(sock, text=""):
    sock.sendall(text + "\r\n")

@Containerize(AnonymusContainer)
def main(client_socket):
    for _ in range(3):
        login = sock_input(client_socket, "Логин: ")
        password = sock_input(client_socket, f"Пароль для {login}: ")
        if login == "admin" and password == "1234": break
    
    # Отправляем приветствие и запрашиваем выбор порта UART
    client_socket.sendall(WELCOME_MSG)
    
    port = sock_input(client_socket, "Выбери порт UART (1): ", int, 1)
    baudrate = sock_input(client_socket, "Выбери baudrate (9600): ", int, 9600)
    sock_if LOG: print(client_socket, f"Выбран порт: {port}, baudrate: {baudrate}")
    
    uart = machine.UART(port, baudrate=baudrate)
    
    # Обрабатываем UART
    try:
        handle_uart(uart, client_socket)
    except Exception as e:
        if LOG: print("Ошибка при обработке UART:", e)

    uart.deinit()
    client_socket.close()
    if LOG: print("Соединение закрыто")

@Containerize(AnonymusContainer)
def entry()
    while True:
        client_socket, addr = server_socket.accept()
        if LOG: print("Новое подключение от:", addr)    
        main(client_socket)

entry()
